/**包含顶级import或者export的文件都被当成一个模块。相反地，如果一个文件不带有顶级的import或者export声明，那么它的内容被视为全局可见的
 * 难怪上面那个文件夹里面定义变量必须得全局唯一
 */

export interface StringValidator{
  isAcceptable(s:string): boolean;
}

let x : number; //包含了export，可以定义同名的x变量了,不会提示和base.ts中冲突了
export const numberRegexp = /^[0-9]+$/;


//导出语句很便利，因为我们可能需要对导出的部分重命名，所以上面的例子可以这样改写：
class ZipCodeValidator implements StringValidator{
  isAcceptable(s:string): boolean{
    return s.length === 5 && numberRegexp.test(s);
  }
}
export{ZipCodeValidator}
export{ZipCodeValidator as mainValidator}


//我们经常会去扩展其它模块，并且只导出那个模块的部分内容。 重新导出功能并不会在当前模块导入那个模块或定义一个新的局部变量。
export class ParseIntBaseZipCodeValidator{
  isAcceptable(s:string){
    return s.length === 5;
  }
}
//导出原先的验证器，但做了重名名
// export {ZipCodeValidator as RegExpBasedZipCodeValidator} from "./ZipCodeValidator";
//export * from "./StringValidator"; // exports interface StringValidator

//导入一个模块中的某个导出内容,类似vue中的解构赋值
// import { ZipCodeValidator } from "./ZipCodeValidator";

export default function (s: string) {
  return s.length === 5 && numberRegexp.test(s);
}
//default导出也可以是一个值
// export default "123";


/**export = 和import = require()
 */
// class ZipCodeValidator{
//   isAcceptable(s:string){
//     return s.length === 5 && numberRegexp.test(s);
//   }
// }
// export = ZipCodeValidator;


